FastAPIをuvを使って、Dockerfileを作成

FastAPIをuvを使って、Dockerfileを作成

Clock Icon2024.10.11

まえがき

前回は uv で Python のプロジェクト管理をしました。

Fastapi を Docker で起動するための Dockerfile を作成します。

uv を使う方法と Python のデフォルトのパッケージ管理 pip を使った方法を作成します。

uv をつかった Dockerfile

Dockerfile 作成

前提として docker コマンドはインストール済みとします。

uv のドキュメントの FastAPI での使用例を参考に、Dockerfileを作成します。

FROM python:3.12-slim

# Install uv.
COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv

# Copy the application into the container.
COPY . /app

# Install the application dependencies.
WORKDIR /app
RUN uv sync --frozen --no-cache

# Run the application.
CMD ["/app/.venv/bin/fastapi", "run", "app/main.py", "--port", "80", "--host", "0.0.0.0"]

docker で build して、run をしてみる

$ docker build -t fastapi-app .
$ docker run -p 8000:80 fastapi-app

http://127.0.0.1:8000 にアクセスすると、{"Hello":"World"} と表示されて、動作確認ができました。

pip をつかった Dockerfile

requirements.txt に吐き出す

uv を使わず、標準の pip を使う場合は、pip でも読めるrequirements.txtで依存関係を作成します。

uv からrequirements.txtを作成するコマンドがあります。

$ uv export -o requirements.txt --no-hashes

Dockerfile を作成

FastAPI のドキュメントを参考に Dockerfile を作ります。

FROM python:3.12-slim

WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

docker で build して、run をしてみる

FROM python:3.12-slim

WORKDIR /code

COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

docker で build して、run をしてみる

$ docker build -t fastapi-app .
$ docker run -p 8000:80 fastapi-app

http://127.0.0.1:8000 にアクセスすると、{"Hello":"World"} と表示されて、動作確認ができました。

まとめ

本番環境では、なるべく軽く、脆弱性発生要素を少なくするために必須以外のツール類を削除したいケースはあります。

uv のセットアップをしたくない場合もあると思いますので、その時はrequirements.txtの形式に出力することもできます。開発では uv を便利に使って、本番では pip を使うなど切り替えも簡単ですね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.